#ifndef AST_VECTOR
#define AST_VECTOR
#include <string>
#include "node.h"

namespace AST {

    /**
     * Vetor
     *
     * Estrutura utilizada como variável, porém com expressão que representa o
     * deslocamento de memória que deve ser utilizado a partir do ponto inicial
     * na memória. Durante a construção, recebe como parâmetros a variável ou
     * vetor inicial e expressão que representa o deslocamento de memória.
     *
     * @category AST
     * @package  AST
     */
    class Vector : public Node {

    private:

        /**
         * Identificação do Vetor
         */
        Node* _identifier;

        /**
         * Deslocamento de Memória
         */
        Node* _offset;

        /**
         * Configuração do Identificador
         *
         * Durante a construção de instância desta classe é necessário
         * apresentar o nó de árvore abstrata de sintaxe que representa o
         * identificador do vetor, seja ele um outro vetor ou variável.
         *
         * @param  Node*   Elemento para Configuração
         * @return Vector* Próprio Objeto para Encadeamento
         */
        Vector* _setIdentifier(Node*);

        /**
         * Configuração de Deslocamento
         *
         * Caracterizando um vetor, existe uma expressão que processa o
         * deslocamento de memória que deve ser utilizado a partir do elemento
         * identificador.
         *
         * @param  Node*   Elemento para Configuração
         * @return Vector* Próprio Objeto para Encadeamento
         */
        Vector* _setOffset(Node*);

    public:

        /**
         * Construtor Padrão
         *
         * Método para inicialização de instância de classe representante de
         * vetor na linguagem, utilizando como base um identificador que pode
         * ser considerado como variável ou outro vetor e uma expressão que
         * identifica um deslocamento de memória.
         *
         * @param Node* Elemento Representante de Variável ou Vetor
         * @param Node* Elemento Representante de Expressão para Deslocamento
         */
        Vector(Node*, Node*);

        /**
         * Apresentação do Identificador
         *
         * Elemento configurado como identificador do vetor, sendo este
         * considerado como uma variável ou outro vetor na linguagem.
         *
         * @return Node* Elemento Solicitado
         */
        Node* getIdentifier();

        /**
         * Apresentação de Deslocamento
         *
         * Elemento configurado como representante do deslocamento que deve ser
         * executado a partir do endereço de memória do identificador
         * configurado.
         *
         * @return Node* Elemento Solicitado
         */
        Node* getOffset();

        // Sobrescrita
        std::string toString(int);

    };

};

#endif

